package com.psdi.element;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

/**
 * 元素对象基类
 */
public abstract class ElementObject {
    public Transform transform;
    public Tag tag = Tag.ANY; // 元素对象的标签，用于标识元素类型
    public ImageIcon image;
    // 不应在基类设置非通用属性
    private boolean isAlive = true; // 元素对象是否存活

    public ElementObject() {
    }

    public ElementObject(int x, int y, int width, int height, ImageIcon image) {
        transform = new Transform(new Position(x, y), new Rotation(), new Size(width, height));
        this.image = image;
    }

    /**
     * 显示元素对象。
     * 如果元素对象的旋转角度不为 0，则会对图像进行旋转处理。
     * 最终将图像绘制到指定的图形上下文中。
     *
     * @param g 图形上下文，用于绘制元素对象。
     */
    public void show(Graphics g) {
        g.drawImage(this.getImage().getImage(),
                (int) transform.position.x,
                (int) transform.position.y,
                transform.size.width,
                transform.size.height,
                null);
    }

    /**
     * 更新元素对象的状态。
     * 子类可以覆盖此方法以实现特定的更新逻辑。
     * 每帧调用此方法
     */
    public void update() {
        // 默认实现为空，子类可以覆盖此方法以更新元素状态
    }

    protected void updateImage() {
        // 默认实现为空，子类可以覆盖此方法以更新图像
    }

    public ImageIcon getImage() {
        return image;
    }

    public void setImage(ImageIcon image) {
        this.image = image;
        Rotate();
    }
    public void Rotate(){
        if (transform.rotation.z != 0) {
            BufferedImage bufferedImage = new BufferedImage(image.getImage().getWidth(null),
                    image.getImage().getHeight(null), BufferedImage.TYPE_INT_ARGB);
            Graphics2D graphics2D = bufferedImage.createGraphics();
            graphics2D.rotate(Math.toRadians(transform.rotation.z), image.getImage().getWidth(null) / 2.0, image.getImage().getHeight(null) / 2.0);
            graphics2D.drawImage(image.getImage(), 0, 0, null);
            graphics2D.dispose();
            image = new ImageIcon(bufferedImage);
        }
    }
    public ElementObject create(String string) {
        return null;
    }

    public final boolean isAlive() {
        return isAlive;
    }

    public final void setAlive(boolean alive) {
        isAlive = alive;
    }

    /**
     * 元素将要销毁时调用此方法。
     */
    public void onDestroy() {

    }
}
